package com.ruoyi.common.utils.token;

import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class TokenUtil {

    //设置token超时时间
    private static final Long TOKEN_TIME_OUT = 24 * 30L * 24L * 60L * 60L;

    @Autowired
    private RedisUtil redisUtils;

    /**
     * @param phone   手机号
     * @param userId    userId
     * @param userMap 用户信息
     * @return
     */
    public String UserToken(String phone, String userId, Map<String, Object> userMap) {
        String token;
        String key = Constants.USER_LOGIN + userMap.get("id");

        // 根据用户Id获取用户token信息
        try {
            token = redisUtils.get(key).toString();
        } catch (Exception e) {
            token = null;
        }

        /**
         * 判断是否是新用户登陆
         * 是 生成token返回
         * 不是 删除旧的token 生成新的token返回
         */
        if (token != null) {
            //删除旧的token信息
            redisUtils.del(key);
            redisUtils.del(token);
        } else {
            //先删除旧的存有用户信息的Token
            if (redisUtils.hasKey(key)) {
                if (redisUtils.hasKey(redisUtils.get(key).toString())) {
                    redisUtils.del(redisUtils.get(redisUtils.get(key).toString()).toString());
                    redisUtils.del(redisUtils.get(key).toString());
                }
            }
        }


        //声成一个以用户名+密码+时间的 MD5 值作为 ToKen 存入 userTokenMap
        token = CustomMD5.strAndSalt(phone + userId, System.currentTimeMillis() + "", 1);

        //将 token 存入 缓存
        redisUtils.set(key, token);

        //将用户登陆的信息存入生成的 Token
        redisUtils.set(token, userMap, TOKEN_TIME_OUT);

        return token;
    }

    /**
     * 校验token是否有效
     *
     * @param strtoken
     * @return
     */
    public Map<String, Object> checkToken(String strtoken) {
        try {
            //判断token是否存在
            if (redisUtils.hasKey(strtoken)) {
                Map<String, Object> userMap = (Map<String, Object>) redisUtils.get(strtoken);
                if (userMap != null) {
                    redisUtils.expire(strtoken, TOKEN_TIME_OUT);
                    userMap.put("token", strtoken);
                    return userMap;
                }
            }
        } catch (Exception e) {
            return null;
        }
        return null;
    }

    /**
     * 删除用户token
     *
     * @param id
     */
    public void deleteUserToken(String id) {
        String key = Constants.USER_LOGIN + id;
        //清除用户APP登陆的令牌
        try {
            if (redisUtils.hasKey(key)) {
                if (redisUtils.hasKey(redisUtils.get(key).toString())) {
                    redisUtils.del(redisUtils.get(redisUtils.get(key).toString()).toString());
                    redisUtils.del(redisUtils.get(key).toString());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
